/*
 * Copyright (C) 2009 2DAI
 *
 * Este programa es Software Libre; usted puede redistribuirlo
 * y/o modificarlo bajo los términos de la "GNU General Public
 * License" como lo publica la "FSF Free Software Foundation",
 * o (a su elección) de cualquier versión posterior.
 *
 * Este programa es distribuido con la esperanza de que le será
 * útil, pero SIN NINGUNA GARANTIA; incluso sin la garantía
 * implícita por el MERCADEO o EJERCICIO DE ALGUN PROPOSITO en
 * particular. Vea la "GNU General Public License" para más
 * detalles.
 *
 * Usted debe haber recibido una copia de la "GNU General Public
 * License" junto con este programa, si no, escriba a la "FSF
 * Free Software Foundation, Inc.", 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 */
package util;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import logic.LoginLogic;

/**
 *
 * @author 2Dai
 * Realizado por Jorge Garrido Oval
 * Pasos a seguir para utilizar esta clase:
 * 1º instanciarla
 * 2º conectar
 * 3º ejecutar
 * 4º desconectar
 */
public class Sql {
    // Atributos

   // private static final String URL = "jdbc:mysql://217.76.156.86/qea595";
   // private static final String USUARIO = "qea595";
    //private static final String CLAVE = "WM6SA6RG3KZ3";
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://" + LoginLogic.pref.getBd_direccion() + "/" + LoginLogic.pref.getBd_bd();
    private static final String USUARIO = LoginLogic.pref.getBd_usuario();
    private static final String CLAVE = LoginLogic.pref.getBd_password();
    private Connection conn;
    private Statement sen;
    private ResultSet rs;
    private DatabaseMetaData dbmd;

    // Constructores
    /**
     * Constructor por defecto.
     * Este constructor nos iniciará esta clase con el driver.
     */
    public Sql() {
        try {
            Class.forName(DRIVER).newInstance();
        } catch (InstantiationException ex) {
            Errors.creaError("ERROR: Imposible crear instancia\n" + ex.getMessage(), ex.getStackTrace());
        } catch (IllegalAccessException ex) {
            Errors.creaError("ERROR: Acceso ilegal\n" + ex.getMessage(), ex.getStackTrace());
        } catch (ClassNotFoundException ex) {
            Errors.creaError("ERROR: Clase no encontrada\n" + ex.getMessage(), ex.getStackTrace());
        }
    }

    /**
     * Este método nos conectará a la base de datos con el usuario y 
     * la contraseña que hayamos especificado.
     */
    public void conectar() {
        try {
            conn = (Connection) DriverManager.getConnection(URL, USUARIO, CLAVE);
        } catch (SQLException ex) {
            ex.printStackTrace();
            Errors.creaError("ERROR: Datos de acceso incorrectos\n" + ex.getMessage(), ex.getStackTrace());
        }
    }

    /**
     * Entra una consulta o listado de tablas y devuelve el resulset
     * @param sql Consulta ha hacer.
     * @return ResultSet con la consulta hecha.
     */
    public ResultSet ejecutarSelect(String sql) {
        try {
            sen = (Statement) conn.createStatement();
            rs = (ResultSet) sen.executeQuery(sql);
        } catch (SQLException ex) {
            Errors.creaError("ERROR: No se puede crear sentencia\n" + ex.getMessage(), ex.getStackTrace());
        }
        return rs;
    }

    /**
     * Entra un insert,update,delete o create y devuelve si a sido correcto.
     * @param sql Consulta ha hacer.
     * @return boolean Devuelve true o false dependiendo si se ha podido hacer o no la alteración.
     */
    public boolean ejectarUpdate(String sql) {
        try {
            sen = (Statement) conn.createStatement();
            sen.executeUpdate(sql);
        } catch (SQLException ex) {
            Errors.creaError("ERROR: No se puede crear sentencia\n" + ex.getMessage(), ex.getStackTrace());
            return false;
        }
        return true;
    }

    /**
     * Este método nos permitirá listar las tablas que hay dentro de la base de datos.
     * @return ResultSet Tablas de la base de datos.
     */
    public ResultSet listarTablas() {
        try {
            dbmd = (DatabaseMetaData) conn.getMetaData();
            String tipos[] = {"TABLE"};
            rs = (ResultSet) dbmd.getTables(null, null, "%", tipos);
        } catch (SQLException ex) {
            Errors.creaError("ERROR: No se puede listar tablas\n" + ex.getMessage(), ex.getStackTrace());
            return null;
        }
        return rs;
    }

    /**
     * Este método nos permitirá listar las tablas que hay dentro de la base de datos.
     * Utilizando la consulta sql "Show Tables"
     * @return ResultSet Tablas de la base de datos.
     */
    public ResultSet listarTablas2() {
        try {
            rs = sen.executeQuery("show tables");
            return rs;
        } catch (SQLException ex) {
            Errors.creaError("ERROR: No se puede listar tablas\n" + ex.getMessage(), ex.getStackTrace());
            return null;
        }
    }

    /**
     * Este método nos permitirá desconectarnos de la base de datos.
     */
    public void desconectar() {
        try {
            if (rs != null) {
                rs.close();
            }
            if (sen != null) {
                sen.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException ex) {
            Errors.creaError("ERROR: No fue posible desconectar de la BD\n" + ex.getMessage(), ex.getStackTrace());
        }
    }
}
